/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

import br.com.webhomesites.configuracao.model.CidadeDAO;
import br.com.webhomesites.configuracao.model.CidadeModel;
import br.com.webhomesites.configuracao.model.EstadoDAO;
import br.com.webhomesites.configuracao.model.EstadoModel;
import br.com.webhomesites.locacao.contracts.IEmpresaManutencaoPresenter;
import br.com.webhomesites.locacao.contracts.IEmpresaManutencaoView;
import br.com.webhomesites.locacao.model.EmpresaManutencaoDAO;
import br.com.webhomesites.locacao.model.EmpresaManutencaoModel;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.AlterarActionListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.CampoKeyListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.CancelarActionListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.InserirActionListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.ItemChangedListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.RemoverActionListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.SairActionListener;
import br.com.webhomesites.locacao.presenter.EmpresaManutencaoPresenterActionListeners.SalvarActionListener;
import br.com.webhomesites.locacao.view.EmpresaManutencaoView;
import br.com.webhomesites.padrao.utils.GenericValidator;
import br.com.webhomesites.padrao.utils.Strategy;
import br.com.webhomesites.padrao.utils.Validator;
import javax.swing.JOptionPane;

/**
 *
 * @author Webhome
 */
public class EmpresaManutencaoPresenter implements IEmpresaManutencaoPresenter {

    private EmpresaManutencaoModel empresaManutencaoModel;
    private EmpresaManutencaoDAO empresaManutencaoDAO;
    private EmpresaManutencaoView epresaManutencaoView;
    private CidadeModel cidadeModel;
    private EstadoModel estadoModel;
    private EstadoDAO estadoDAO;
    private CidadeDAO cidadeDAO;
    public final Strategy INSERT_STRATEGY = new InsertStrategy();
    public final Strategy UPDATE_STRATEGY = new UpdateStrategy();
    private Strategy operacao = INSERT_STRATEGY;
    private Validator<EmpresaManutencaoModel> validador = new GenericValidator<>();
    public static boolean validado = false;

    public EmpresaManutencaoPresenter(EmpresaManutencaoModel empresaManutencaoModel, EmpresaManutencaoView epresaManutencaoView, EmpresaManutencaoDAO empresaManutencaoDAO, CidadeModel cidadeModel, EstadoModel estadoModel, EstadoDAO estadoDAO, CidadeDAO cidadeDAO) {
        this.empresaManutencaoModel = empresaManutencaoModel;
        this.epresaManutencaoView = epresaManutencaoView;
        this.empresaManutencaoDAO = empresaManutencaoDAO;
        this.estadoModel = estadoModel;
        this.cidadeModel = cidadeModel;
        this.cidadeDAO = cidadeDAO;
        this.estadoDAO = estadoDAO;
    }

    @Override
    public void setUpViewListeners() {
        epresaManutencaoView.setInserirActionListener(new InserirActionListener(this));
        epresaManutencaoView.setRemoverActionListener(new RemoverActionListener(this));
        epresaManutencaoView.setAlterarActionListener(new AlterarActionListener(this));
        epresaManutencaoView.setCancelarActionListener(new CancelarActionListener(this));
        epresaManutencaoView.setSalvarActionListener(new SalvarActionListener(this));
        epresaManutencaoView.setBtnSairActionListener(new SairActionListener());

        epresaManutencaoView.setMascaraListener(new CampoKeyListener(this));
        epresaManutencaoView.setRbPessoaFisicaActionListener(new ItemChangedListener(this));
        epresaManutencaoView.setRbPessoaJuridicaActionListener(new ItemChangedListener(this));
    }

    @Override
    public void updateModelFromView() {
        empresaManutencaoModel.setId(epresaManutencaoView.getCodigo());
        empresaManutencaoModel.setPessoa(epresaManutencaoView.getPessoa());
        System.out.println("Pessoa: " + epresaManutencaoView.getPessoa());
        empresaManutencaoModel.setNome(epresaManutencaoView.getNome());
        switch (empresaManutencaoModel.getPessoa()) {
            case "F":
                empresaManutencaoModel.setRazaoSocial("  ");
                empresaManutencaoModel.setCnpj("  ");
                empresaManutencaoModel.setInscricaoEstadual("  ");
                empresaManutencaoModel.setCpf(epresaManutencaoView.getCpf());
                empresaManutencaoModel.setRg(epresaManutencaoView.getRg());
                break;
            case "J":
                empresaManutencaoModel.setCpf("  ");
                empresaManutencaoModel.setRg("  ");
                empresaManutencaoModel.setRazaoSocial(epresaManutencaoView.getRazaoSocial());
                empresaManutencaoModel.setCnpj(epresaManutencaoView.getCnpj());
                empresaManutencaoModel.setInscricaoEstadual(epresaManutencaoView.getInscricaoEstadual());
                break;
        }
        empresaManutencaoModel.setEndereco(epresaManutencaoView.getEndereco());
        empresaManutencaoModel.setBairro(epresaManutencaoView.getBairro());
        empresaManutencaoModel.setCodigoCidade(cidadeDAO.getIdByDescricao(epresaManutencaoView.getCidade()));
        empresaManutencaoModel.setCodigoEstado(estadoDAO.getIdByDescricao(epresaManutencaoView.getEstado()));
        empresaManutencaoModel.setTelefone(epresaManutencaoView.getTelefone());
        empresaManutencaoModel.setCelular(epresaManutencaoView.getCelular());
        empresaManutencaoModel.setEmail(epresaManutencaoView.getEmail());
        //System.out.println(empresaManutencaoModel.toString());     

        if (empresaManutencaoModel.getPessoa().equals("F")) {

            if (validador.isCPF(empresaManutencaoModel.getCpf())) {

                if (validador.validarEntidade(epresaManutencaoView, empresaManutencaoModel)) {
                    empresaManutencaoDAO.save(empresaManutencaoModel);
                    System.out.println("******Listagem do EmpresaManutencao Insediro = " + "\n");
                    empresaManutencaoModel.toString();
                    validado = true;
                }
            } else {
                JOptionPane.showMessageDialog(epresaManutencaoView, "CPF inválido!");
            }
        }
        
        if (empresaManutencaoModel.getPessoa().equals("J")) {

            if (validador.isCNPJ(empresaManutencaoModel.getCnpj())) {

                if (validador.validarEntidade(epresaManutencaoView, empresaManutencaoModel)) {
                    empresaManutencaoDAO.save(empresaManutencaoModel);
                    System.out.println("******Listagem do EmpresaManutencao Insediro = " + "\n");
                    empresaManutencaoModel.toString();
                    validado = true;
                }
            } else {
                JOptionPane.showMessageDialog(epresaManutencaoView, "CNPJ inválido!");
            }
        }

    }

    @Override
    public void updateViewFromModel() {
        if (empresaManutencaoModel != null) {
            epresaManutencaoView.setCodigo(empresaManutencaoModel.getId());
            epresaManutencaoView.setRazaoSocial(empresaManutencaoModel.getRazaoSocial());
            epresaManutencaoView.setCnpj(empresaManutencaoModel.getCnpj());
            epresaManutencaoView.setInscricaoEstadual(empresaManutencaoModel.getInscricaoEstadual());
            epresaManutencaoView.setBairro(empresaManutencaoModel.getBairro());
            //epresaManutencaoView.setCidade(empresaManutencaoModel.getListaCidades());  
            //epresaManutencaoView.setEstado(estadoModel.getListaEstados()); 
            epresaManutencaoView.setTelefone(empresaManutencaoModel.getTelefone());
            epresaManutencaoView.setEmail(empresaManutencaoModel.getEmail());
        } else {
            epresaManutencaoView.clearFields();
        }
    }

    @Override
    public void novoEmpresaManutencao() {
        validado = false;
        empresaManutencaoModel = new EmpresaManutencaoModel();
        epresaManutencaoView.setCodigo(empresaManutencaoDAO.getMaxId() + 1);
        epresaManutencaoView.setPessoaFisicaSelected(true);
        epresaManutencaoView.enableTxtEmpresaManutencaoInscricaoEstadual(false);
        epresaManutencaoView.enableTxtEmpresaManutencaoCnpj(false);
        epresaManutencaoView.enableTxtEmpresaManutencaoRazaoSocial(false);
    }

    @Override
    public void inserirEmpresaManutencao() {
        this.updateModelFromView();

    }

    @Override
    public void alterarEmpresaManutencao() {
        this.updateModelFromView();
    }

    @Override
    public void removerEmpresaManutencao() {
        this.updateModelFromView();
    }

    @Override
    public void habilitarEdicao(boolean arg) {
        epresaManutencaoView.enableTxtEmpresaManutencaoCodigo(arg);
        epresaManutencaoView.enableRgEmpresaManutencaoPessoa(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoNome(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoRazaoSocial(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoCpf(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoRg(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoCnpj(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoInscricaoEstadual(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoTelefone(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoCelular(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoEmail(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoEndereco(arg);
        epresaManutencaoView.enableTxtEmpresaManutencaoBairro(arg);
        epresaManutencaoView.enableComboEmpresaManutencaoCidade(arg);
        epresaManutencaoView.enableComboEmpresaManutencaoEstado(arg);

        epresaManutencaoView.enableBtnCancelar(arg);
        epresaManutencaoView.enableBtnRemover(arg);
        epresaManutencaoView.enableBtnSalvar(arg);
    }

    @Override
    public IEmpresaManutencaoView getView() {
        return epresaManutencaoView;
    }

    @Override
    public EmpresaManutencaoModel getModel() {
        return empresaManutencaoModel;
    }

    @Override
    public void setView(EmpresaManutencaoView epresaManutencaoView) {
        this.epresaManutencaoView = epresaManutencaoView;
    }

    @Override
    public void setModel(EmpresaManutencaoModel model) {
        this.empresaManutencaoModel = model;
    }

    @Override
    public void createView() {
        //this.novoEmpresaManutencao();            
        this.setUpViewListeners();
        //this.habilitarEdicao(false);  
        epresaManutencaoView.removeAllitensComboEmpresaManutencaoCidade();
        epresaManutencaoView.removeAllitensComboEmpresaManutencaoEstado();
        epresaManutencaoView.setCidade(cidadeDAO.findAll());
        epresaManutencaoView.setEstado(estadoDAO.findAll());
        epresaManutencaoView.packAndShow();
    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    private class InsertStrategy implements Strategy {

        @Override
        public void execute() {
            inserirEmpresaManutencao();
        }
    }

    private class UpdateStrategy implements Strategy {

        @Override
        public void execute() {
            alterarEmpresaManutencao();
        }
    }
}
